
#pragma region  【算法5 - 12】求图上任意两点之间的最短路径-- - Floyd 算法
#define MaxVerNum   …
void floyd(MGraph *G, int path[][MaxVerNum], int dist[][MaxVerNum])
{ // path存储路径。path[i][j]=k表示，"顶点i"到"顶点j"的最短路径会经过顶点k。
  // dist长度数组。dist[i][j]=sum表示，"顶点i"到"顶点j"的最短路径的长度是sum。
    int i, j, k;
    int tmp;
    // 初始化
    for (i = 0; i < G->vnum; i++)
    {
        for (j = 0; j < G->vnum; j++)
        {
            dist[i][j] = G->edges[i][j]; // "顶点i"到"顶点j"的路径长度为"i到j的权值"。
            path[i][j] = j;              // "顶点i"到"顶点j"的最短路径是经过顶点j。
        }
    }
    // 计算最短路径
    for (k = 0; k < G->vexnum; k++)
    {
        for (i = 0; i < G->vexnum; i++)
        {
            for (j = 0; j < G->vexnum; j++)
            { //如果经过下标为k顶点路径比原两点间路径更短，则更新dist[i][j]和path[i][j]
                tmp = (dist[i][k] == INF || dist[k][j] == INF) ? INF : (dist[i][k] + dist[k][j]);
                if (dist[i][j] > tmp)
                { //"i到j最短路径"对应的值设，为更小的一个(即经过k)
                    dist[i][j] = tmp;
                    // "i到j最短路径"对应的路径，经过k
                    path[i][j] = path[i][k];
                }
            }
        }
    }
    //打印floyd最短路径的结果
    printf("floyd: \n");
    for (i = 0; i < G->vnum; i++)
    {
        for (j = 0; j < G->vnum; j++)
            printf("%2d  ", dist[i][j]);
        printf("\n");
    }
}
//容易分析得到Floyd算法的时间复杂度为O（n3)
#pragma endregion